home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-68k-src / machines / amiga68k / libsrc / _lmath.s < prev    next >
Text File  |  1999-01-01  |  2KB  |  152 lines

  1. ;   32bit Division/Modulo fuer 68000
  2.  
  3. * Functions:
  4. *  long           __divu(register long d0, register long d1)
  5. *  long           __divs(register long d0, register long d1)
  6. *  long           __modu(register long d0, register long d1)
  7. *  long           __mods(register long d0, register long d1)
  8. *  __ldivs etc. erwarten Parameter auf dem Stack
  9.  
  10.  
  11.     code
  12.  
  13.     xdef    __divu
  14.     xdef    __divs
  15.     xdef    __modu
  16.     xdef    __mods
  17.     xdef    __ldivs
  18.     xdef    __ldivu
  19.     xdef    __lmods
  20.     xdef    __lmodu
  21.  
  22.  
  23. __lmods
  24.     movem.l    4(sp),d0/d1
  25. __mods:
  26.     tst.l    d1
  27.     bmi    1$
  28.     tst.l    d0
  29.     bmi    2$
  30.     bsr    __divu
  31.     move.l    d1,d0
  32.     rts
  33. 1$:    neg.l    d1
  34.     tst.l    d0
  35.     bmi    3$
  36.     bsr    __divu
  37.     neg.l    d1
  38.     move.l    d1,d0
  39.     rts
  40. 2$:    neg.l    d0
  41.     bsr    __divu
  42.     neg.l    d1
  43.     move.l    d1,d0
  44.     rts
  45. 3$:    neg.l    d0
  46.     bsr    __divu
  47.     move.l    d1,d0
  48.     rts
  49.  
  50.  
  51. __lmodu
  52.     movem.l    4(sp),d0/d1
  53. __modu:
  54.     bsr    __divu
  55.     move.l    d1,d0
  56.     rts
  57.  
  58.  
  59. __ldivs
  60.     movem.l    4(sp),d0/d1
  61. __divs:
  62.     tst.l    d0
  63.     bpl    2$
  64.     neg.l    d0
  65.     tst.l    d1
  66.     bpl    1$
  67.     neg.l    d1
  68.     bsr    __divu
  69.     neg.l    d1
  70.     rts
  71. 1$:    bsr    __divu
  72.     neg.l    d0
  73.     neg.l    d1
  74.     rts
  75. 2$:    tst.l    d1
  76.     bpl    __divu
  77.     neg.l    d1
  78.     bsr    __divu
  79.     neg.l    d0
  80.     rts
  81.  
  82.  
  83. __ldivu
  84.     movem.l    4(sp),d0/d1
  85. __divu:
  86.     move.l    d2,-(sp)
  87.     swap    d1
  88.     move.w    d1,d2
  89.     bne    2$
  90.     swap    d0
  91.     swap    d1
  92.     swap    d2
  93.     move.w    d0,d2
  94.     beq    1$
  95.     divu    d1,d2
  96.     move.w    d2,d0
  97. 1$:    swap    d0
  98.     move.w    d0,d2
  99.     divu    d1,d2
  100.     move.w    d2,d0
  101.     swap    d2
  102.     move.w    d2,d1
  103.     move.l    (sp)+,d2
  104.     rts
  105. 2$:    move.l    d3,-(sp)
  106.     moveq    #16,d3
  107.     cmp.w    #$80,d1
  108.     bhs    3$
  109.     rol.l    #8,d1
  110.     subq.w    #8,d3
  111. 3$:    cmp.w    #$800,d1
  112.     bhs    4$
  113.     rol.l    #4,d1
  114.     subq.w    #4,d3
  115. 4$:    cmp.w    #$2000,d1
  116.     bhs    5$
  117.     rol.l    #2,d1
  118.     subq.w    #2,d3
  119. 5$:    tst.w    d1
  120.     bmi    6$
  121.     rol.l    #1,d1
  122.     subq.w    #1,d3
  123. 6$:    move.w    d0,d2
  124.     lsr.l    d3,d0
  125.     swap    d2
  126.     clr.w    d2
  127.     lsr.l    d3,d2
  128.     swap    d3
  129.     divu    d1,d0
  130.     move.w    d0,d3
  131.     move.w    d2,d0
  132.     move.w    d3,d2
  133.     swap    d1
  134.     mulu    d1,d2
  135.     sub.l    d2,d0
  136.     bhs    8$
  137.     subq.w    #1,d3
  138.     add.l    d1,d0
  139. 7$:    bhs.s    7$
  140. 8$:    moveq    #0,d1
  141.     move.w    d3,d1
  142.     swap    d3
  143.     rol.l    d3,d0
  144.     swap    d0
  145.     exg    d0,d1
  146.     move.l    (sp)+,d3
  147.     move.l    (sp)+,d2
  148.     rts
  149.  
  150.     
  151.     end
  152.